package datastructure.stack;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

/**
 * 使用栈实现计算器
 * @author lbw
 */
public class PolandNotation {

    public static void main(String[] args) {
        //定义一个逆波兰表达式 (3+4)*5-6
        //为了方便，逆波兰表达式的数字和符号使用空格隔开
        String suffixExpression = "3 4 + 5 * 6 -";
        /**
         * 1.先将表达式放入到ArrayList中
         * 2.将arrayList传递给一个方法，配合栈完成计算
         */
        List<String> list = getListString(suffixExpression);
        System.out.println(calculate(list));
    }

    /**
     * 将一个逆波兰表达式，依次将数据和运算符放入到ArrayList中
     * @param suffixExpression
     * @return
     */
    public static List<String> getListString(String suffixExpression){
        String[] split = suffixExpression.split(" ");
        return new ArrayList<>(Arrays.asList(split));
    }

    public static int calculate(List<String> ls){
        //创建栈，只需要一个栈即可
        Stack<String> stack = new Stack<>();
        for (String item : ls) {
            if (item.matches("\\d+")){
                //入栈
                stack.push(item);
            } else {
                //pop出两个数，并运算，再入栈
                int num2 = Integer.parseInt(stack.pop());
                int num1 = Integer.parseInt(stack.pop());
                int res = 0;
                if ("+".equals(item)){
                    res = num1 + num2;
                } else if ("-".equals(item)){
                    res = num1 - num2;
                } else if ("*".equals(item)){
                    res = num1 * num2;
                } else if ("/".equals(item)){
                    res = num1 / num2;
                } else {
                    throw new RuntimeException("运算符有误");
                }
                stack.push(String.valueOf(res));
            }
        }
        return Integer.parseInt(stack.pop());
    }
}
